package com.at.partition7;

import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

/**
 * @author huangchao E-mail:fengquan8866@163.com
 * @version 创建时间：2024/9/25 15:55
 */
public class PartitionDemo1 {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(2);

        DataStreamSource<String> socketDS = env.socketTextStream("app01", 7777);

        // 随机分区: random.nextInt(下游算子并行度)
//        socketDS.shuffle().print();

        // 轮询 rebalance: nextChannelToSendTo = (nextChannelToSendTo + 1) % numberOfChannels;
        // 场景：数据源倾斜  source不均匀场景，比如kafka3个分区，分区一 1亿，分区二、三 1万
//        socketDS.rebalance().print();

        // 缩放 rescale: 实现轮询，局部组队，比rebalance高效
//        socketDS.rescale().print();

        // 广播
//        socketDS.broadcast().print();

        // 全局 global：只发往第一个子任务
        // return 0
        socketDS.global().print();

        // keyby: 按指定key去发送，相同key发往同一个子任务
        // one-to-one: Forward分区器

        // 总结：flink提供了7种分区器 + 1种自定义

        env.execute();
    }
}
